#include <stdio.h>
#include <string.h>

#define MAX_N 100
#define MAX_LEN 11
/*
代码注释说明：
主函数 main:
读取电话号码的数量 n。
使用二维数组 str 存储 n 个电话号码。
依次读取每个电话号码并存储到数组中。
调用 IsPrefCode 函数判断电话号码集合是否为前缀码，并输出结果。

IsPrefCode 函数:
使用冒泡排序对电话号码数组进行字典序排序。
遍历排序后的数组，检查每个电话号码是否是下一个电话号码的前缀。
使用 Find 函数判断 str[i] 是否是 str[i+1] 的前缀。
如果有任何一个电话号码是另一个电话号码的前缀，则返回0（表示不是前缀码）。
如果所有电话号码都不满足前缀条件，则返回1（表示是前缀码）。

Find 函数:
使用 strncmp 函数比较两个字符串的前缀部分。
如果 s2 的前 strlen(s1) 个字符与 s1 完全相同，则返回1（表示是前缀）。
否则返回0（表示不是前缀）。*/
// 函数声明
int IsPrefCode(char str[][MAX_LEN], int n);

int Find(char s1[], char s2[]);

int main() {
    int n;
    char str[MAX_N][MAX_LEN];

    // 输入电话号码的数量
    printf("请输入电话号码的数量（不超过100）：");
    scanf("%d", &n);

    // 输入电话号码
    for (int i = 0; i < n; i++) {
        printf("请输入第%d个电话号码：", i + 1);
        scanf("%s", str[i]);
    }

    // 判断电话号码集合是否符合编码要求
    if (IsPrefCode(str, n)) {
        printf("Yes\n");
    } else {
        printf("No\n");
    }

    return 0;
}

// 判断电话号码集合是否为前缀码
int IsPrefCode(char str[][MAX_LEN], int n) {
    // 对电话号码进行字典序排序
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if (strcmp(str[i], str[j]) > 0) {
                // 交换str[i]和str[j]
                char temp[MAX_LEN];
                strcpy(temp, str[i]);
                strcpy(str[i], str[j]);
                strcpy(str[j], temp);
            }
        }
    }

    // 检查相邻的电话号码是否满足前缀条件
    for (int i = 0; i < n - 1; i++) {
        if (Find(str[i], str[i + 1])) {
            return 0;
        }
    }
    return 1;
}

// 判断s1是否是s2的前缀
int Find(char s1[], char s2[]) {
    // 使用strncmp函数比较s1和s2的前strlen(s1)个字符
    if (strncmp(s2, s1, strlen(s1)) == 0) {
        return 1; // 是前缀
    } else {
        return 0; // 不是前缀
    }
}
